/**
 * Copyright 2010 Xeus Technologies 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License. 
 * 
 */

package org.xeustechnologies.jcksum;

import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;

public class ChecksumInputStream extends FilterInputStream {

    private Checksum hashsum;

    public ChecksumInputStream(InputStream in, Checksum hashsum) {
        this( in );
        this.hashsum = hashsum;
    }

    protected ChecksumInputStream(InputStream in) {
        super( in );
    }

    public int read() throws IOException {
        int b = in.read();
        if( b != -1 ) {
            hashsum.update( b );
        }
        return b;
    }

    public int read(byte[] buf, int off, int len) throws IOException {
        len = in.read( buf, off, len );

        if( len != -1 ) {
            hashsum.update( buf, off, len );
        }

        return len;
    }

    public long skip(long n) throws IOException {
        byte[] buf = new byte[512];
        long total = 0;

        while(total < n) {
            long len = n - total;
            len = read( buf, 0, len < buf.length ? (int) len : buf.length );
            if( len == -1 ) {
                return total;
            }
            total += len;
        }

        return total;
    }

    public Checksum getChecksum() {
        return hashsum;
    }

}
